#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include <mutex>
#include <string>
#include "util.hpp"


namespace cloud
{
#define CONFIG_FILE "./cloud.conf"
    class Config//单例配置类
    {
    private:
        Config()
        {
            ReadConfigFile();//构造函数私有化
        }
        static Config *_instance;//单例指针
        static std::mutex _mutex;//互斥锁

    private:
        int _hot_time;//热点判断时间
        int _server_port;//服务器监听端口
        std::string _server_ip;//服务器IP地址
        std::string _download_prefix;//下载的url前缀路径
        std::string _packfile_suffix;//压缩包后缀名称
        std::string _pack_dir;//压缩包存放目录
        std::string _back_dir;//备份文件存放目录
        std::string _backup_file;//数据信息存放文件
        bool ReadConfigFile() // 读取配置文件
        {
            FileUtil fu(CONFIG_FILE);
            std::string body;
            if (fu.GetContent(&body) == false)//读取数据，在body里
            {
                std::cout << "load config file failed\n";
                return false;
            }
            Json::Value root;
            if (JsonUtil::UnSerialize(body, &root) == false)//对body的数据进行反序列化，放到root里
            {
                std::cout << "parse config file failed\n";
                return false;
            }
            _hot_time = root["hot_time"].asInt();
            _server_port = root["server_port"].asInt();
            _server_ip = root["server_ip"].asString();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asString();
            _pack_dir = root["pack_dir"].asString();
            _back_dir = root["back_dir"].asString();
            _backup_file = root["backup_file"].asString();
        }

    public:
        static Config *GetInstance()//向外统一访问接口
        {
            if (_instance == NULL)//造成锁冲突，降低效率，所以进行二次检测
            {
                _mutex.lock();
                if (_instance == NULL)
                {
                    _instance = new Config(); // 实例化一个对象
                }
                _mutex.unlock();
            }
            return _instance;
        }
        int GetHotTime()//获取热点时间
        {
            return _hot_time;
        }
        int GetServerPort()//获取服务器端口
        {
            return _server_port;
        }
        std::string GetServerIp()//获取服务器IP地址
        {
            return _server_ip;
        }
        std::string GetDownloadPrefix()//获取下载的url前缀路径
        {
            return _download_prefix;
        }
        std::string GetPackFileSuffix()//获取压缩包后缀名称
        {
            return _packfile_suffix;
        }
        std::string GetPackDir()//获取压缩包存放目录
        {
            return _pack_dir;
        }
        std::string GetBackDir()//获取备份文件存放目录
        {
            return _back_dir;
        }
        std::string GetBackupFile()//获取备份数据信息存放文件的路径名
        {
            return _backup_file;
        }
    };
    Config *Config::_instance = NULL;
    std::mutex Config::_mutex;
}

#endif